home *** CD-ROM | disk | FTP | other *** search
/ Tech Win 1996 July / CD [TECH_B].bin / tech_b / delphi / unit5_1.pas < prev    next >
Encoding:
Pascal/Delphi Source File  |  1996-04-22  |  9.3 KB  |  386 lines

  1. unit Unit5_1;
  2.  
  3. interface
  4.  
  5. uses
  6.   SysUtils, WinTypes, WinProcs, Messages, Classes, Graphics, Controls,
  7.   Forms, Dialogs, Menus, IniFiles, ExtCtrls, StdCtrls, Buttons, Spin,
  8.   {今回修正分}
  9.   Unit5_2, Unit5_3, Unit5_4, Unit5_5;
  10.   {今回修正分ここまで}
  11.  
  12. type
  13.   TForm1 = class(TForm)
  14.     Panel5: TPanel;
  15.     SpeedButton1: TSpeedButton;
  16.     Timer1: TTimer;
  17.     Mati: TSpinEdit;
  18.     Label6: TLabel;
  19.     Label7: TLabel;
  20.     Nokori: TLabel;
  21.     MainMenu1: TMainMenu;
  22.     K1: TMenuItem;
  23.     Toroku: TMenuItem;
  24.     Sakujo: TMenuItem;
  25.     FileMenu: TMenuItem;
  26.     EndMenu: TMenuItem;
  27.     NewMenu: TMenuItem;
  28.     N1: TMenuItem;
  29.     KH1: TMenuItem;
  30.     KR1: TMenuItem;
  31.     KS1: TMenuItem;
  32.     KA1: TMenuItem;
  33.     procedure FormCreate(Sender: TObject);
  34.     procedure SpeedButton1Click(Sender: TObject);
  35.     procedure Timer1Timer(Sender: TObject);
  36.     procedure FormKeyDown(Sender: TObject; var Key: Word;
  37.       Shift: TShiftState);
  38.     procedure EndMenuClick(Sender: TObject);
  39.     procedure TorokuClick(Sender: TObject);
  40.     procedure SakujoClick(Sender: TObject);
  41.     procedure NewMenuClick(Sender: TObject);
  42.     procedure KH1Click(Sender: TObject);
  43.     procedure KS1Click(Sender: TObject);
  44.     procedure KR1Click(Sender: TObject);
  45.     procedure KA1Click(Sender: TObject);
  46.   private
  47.     { Private 宣言 }
  48.     Start_Time : LongInt;
  49.     Position : Integer;
  50.     FormList : Array[1..4] Of TForm2;  {子フォームを保管する}
  51.     KaitoJun : Array[1..4] Of Integer; {キーを押した順を保管する}
  52.     FormCount : Integer;               {子フォームの数を保管する}
  53.     UpHeight : Integer;                {上下に動ける幅を保管}
  54.   {今回追加分}
  55.     Procedure KaitousyaTuika(Namae : String);
  56.   {今回追加分ここまで}
  57.   public
  58.     { Public 宣言 }
  59.   end;
  60.  
  61. var
  62.   Form1: TForm1;
  63.  
  64. implementation
  65.  
  66. {$R *.DFM}
  67.  
  68. procedure TForm1.FormCreate(Sender: TObject);
  69. begin
  70.      Timer1.Enabled := False;
  71.  
  72.   {今回追加分}
  73.      Application.CreateForm(TForm3, Form3);
  74.      Form3.ShowModal;
  75.      Form3.Free;
  76.   {今回追加分ここまで}
  77.  
  78.      Nokori.Caption := '  0.000';
  79.      Mati.Value := 5;
  80.      FormCount := 0;
  81. end;
  82.  
  83. procedure TForm1.SpeedButton1Click(Sender: TObject);
  84. var
  85.    i : Integer;
  86. begin
  87.  
  88.      {子フォームの表示を出題待ち状態に}
  89.      For i := 1 To FormCount Do
  90.          FormList[i].Clear;
  91.  
  92.      {解答順をクリア}
  93.      For i := 1 To 4 Do
  94.          KaitoJun[i] := -1;
  95.  
  96.      Panel5.SetFocus;
  97.  
  98.      Start_Time := GetTickCount;
  99.      Position := 0;
  100.  
  101.      Nokori.Caption := Format('%3d',[Mati.Value]) + '.000';
  102.      Timer1.Enabled := True;
  103.  
  104. end;
  105.  
  106. procedure TForm1.Timer1Timer(Sender: TObject);
  107. var
  108.    S : Single;
  109.    i, j, k : Integer;
  110. begin
  111.      S := Mati.Value - (GetTickCount - Start_Time) / 1000;
  112.      If (S <= 0) Or (Position >= FormCount) Then
  113.      Begin
  114.           Timer1.Enabled := False;
  115.           Nokori.Caption := '  0.000';
  116.  
  117.           If Position = 0 Then
  118.              ShowMessage('時間切れです')
  119.           Else
  120.           Begin
  121.                For i := 1 To FormCount Do
  122.                    If KaitoJun[i] >= 0 Then
  123.                    Begin
  124.                         j := KaitoJun[i];
  125.                         k := MessageDlg(FormList[j].Caption + 'さんの解答は正解ですか?',
  126.                                       mtConfirmation, mbYesNoCancel, 0);
  127.                         Case k Of
  128.                              mrCancel : Exit;
  129.  
  130.                              mrYes :
  131.                                 Begin
  132.                                      {子フォームのSeikaiメソッドの呼び出し}
  133.                                      FormList[j].Seikai(UpHeight);
  134.                                      Exit;
  135.                                 End;
  136.                                     {子フォームのHuSeikaiメソッドの呼び出し}
  137.                              mrNo : FormList[j].HuSeikai(UpHeight);
  138.                         End;
  139.                    End;
  140.           End;
  141.      End
  142.      Else
  143.          Nokori.Caption := Format('%7.3f',[S]);
  144. end;
  145.  
  146. procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
  147.   Shift: TShiftState);
  148. var
  149.    i : Integer;
  150. begin
  151.      If Not Timer1.Enabled Then
  152.         Exit;
  153.  
  154.      Case Key Of
  155.           VK_F1 :
  156.             Begin
  157.                  Inc(Position);
  158.                  i := 1;
  159.             End;
  160.           VK_F5 :
  161.             Begin
  162.                  Inc(Position);
  163.                  i := 2;
  164.             End;
  165.           VK_F9 :
  166.             Begin
  167.                  Inc(Position);
  168.                  i := 3;
  169.             End;
  170.           VK_F12 :
  171.             Begin
  172.                  Inc(Position);
  173.                  i := 4;
  174.             End;
  175.      End;
  176.  
  177.      If i <= FormCount Then
  178.      Begin
  179.           {子フォームのPushメソッドの呼び出し}
  180.           FormList[i].Push(Position);
  181.           KaitoJun[Position] := i;
  182.      End;
  183.  
  184. end;
  185.  
  186. procedure TForm1.EndMenuClick(Sender: TObject);
  187. begin
  188.      Close;
  189. end;
  190.  
  191. procedure TForm1.TorokuClick(Sender: TObject);
  192. {今回削除分}
  193. {var
  194.    i : Integer;
  195.    L, T : Integer;}
  196. {今回削除分ここまで}
  197. begin
  198.      If TorokuDlg.ShowModal <> mrOK Then
  199.         Exit;
  200. {今回修正分}
  201.      KaitousyaTuika(TorokuDlg.Namae.Text);
  202.  
  203. End;
  204.  
  205. Procedure TForm1.KaitousyaTuika(Namae : String);
  206. var
  207.    i : Integer;
  208.    L, T : Integer;
  209. Begin
  210.  
  211.      FormCount := FormCount + 1;
  212.  
  213.      i := FormCount;
  214.      FormList[i] := TForm2.Create(Self);
  215.  
  216.      FormList[i].Caption := Namae;
  217. {今回修正分ここまで}
  218.      FormList[i].Tag := i;
  219.  
  220.      {親フォームにバランス良く子フォームを配置}
  221.      L := (Form1.ClientWidth - FormCount * FormList[i].Width) Div (FormCount + 1);
  222.      T := Form1.ClientHeight - Panel5.Height - FormList[i].Height;
  223.  
  224.      UpHeight := T Div 10;
  225.  
  226.      For i := 1 To FormCount Do
  227.          FormList[i].SetBounds((i - 1) * (FormList[i].Width + L) + L,
  228.                     T,
  229.                     FormList[i].Width,
  230.                     FormList[i].Height);
  231.  
  232.      {子フォームが配置されたので、削除メニューを有効に}
  233.      Sakujo.Enabled := True;
  234.  
  235.      {同じく、出題ボタンを有効に}
  236.      SpeedButton1.Enabled := True;
  237.  
  238.      {子フォームが4つになったらそれ以上登録できないように}
  239.      {登録メニューを無効に}
  240.      If FormCount >= 4 Then
  241.         Toroku.Enabled := False;
  242.  
  243. end;
  244.  
  245. procedure TForm1.SakujoClick(Sender: TObject);
  246. var
  247.    i, j : Integer;
  248.    L, T : Integer;
  249. begin
  250.      If MessageDlg('解答者' + ActiveMDIChild.Caption + 'を削除してよろしいですか?',
  251.                             mtConfirmation, mbOkCancel, 0) <> mrOk Then
  252.         Exit;
  253.  
  254.      {TagプロパティからFormList配列の添え字を知る}
  255.      j := ActiveMDIChild.Tag;
  256.  
  257.      {FormList配列の空きをつめる}
  258.      For i := j To 3 Do
  259.          FormList[i] := FormList[i + 1];
  260.  
  261.      FormCount := FormCount - 1;
  262.  
  263.      {子フォームを閉じる}
  264.      ActiveMDIChild.Close;
  265.  
  266.      {親フォームにバランス良く子フォームを再配置}
  267.      L := (Form1.ClientWidth - FormCount * ActiveMDIChild.Width) Div (FormCount + 1);
  268.      T := Form1.ClientHeight - Panel5.Height - ActiveMDIChild.Height;
  269.  
  270.      For i := 1 To FormCount Do
  271.      Begin
  272.          FormList[i].SetBounds((i - 1) * (FormList[i].Width + L) + L,
  273.                     T,
  274.                     FormList[i].Width,
  275.                     FormList[i].Height);
  276.          FormList[i].Tag := i;
  277.      End;
  278.  
  279.      {1つ減ったら登録メニューを有効に}
  280.      Toroku.Enabled := True;
  281.  
  282.      {子フォームが無くなったら削除メニューを無効に}
  283.      If FormCount < 1 Then
  284.      Begin
  285.         Sakujo.Enabled := False;
  286.         SpeedButton1.Enabled := False;
  287.      End;
  288.  
  289. end;
  290.  
  291. procedure TForm1.NewMenuClick(Sender: TObject);
  292. var
  293.    i : Integer;
  294. begin
  295.      For i := 1 To FormCount Do
  296.          FormList[i].Close;
  297.  
  298.      FormCount := 0;
  299.  
  300.      Toroku.Enabled := True;
  301.      Sakujo.Enabled := False;
  302.      SpeedButton1.Enabled := False;
  303. end;
  304.  
  305. {今回追加分}
  306. procedure TForm1.KH1Click(Sender: TObject);
  307. var
  308.    i : Integer;
  309. begin
  310.      For i := 1 To FormCount Do
  311.      Begin
  312.          FormList[i].HuSeikai(UpHeight);
  313.          FormList[i].Clear;
  314.      End;
  315. end;
  316.  
  317. procedure TForm1.KS1Click(Sender: TObject);
  318. var
  319.    i : Integer;
  320.    F : TextFile;
  321.    Path : String;
  322.    Pos : Array[0..3] Of Integer;
  323.    Namae : String;
  324. begin
  325.      If MDIChildCount = 0 Then
  326.         Exit;
  327.  
  328.      Path := ExtractFilePath(Application.ExeName);
  329.  
  330.      AssignFile(F, Path + 'AgeSage.Dat');
  331.      ReWrite(F);
  332.  
  333.      WriteLn(F, MDIChildCount);
  334.      For i := 1 To MDIChildCount Do
  335.      Begin
  336.           WriteLn(F, FormList[i].Caption);
  337.           WriteLn(F, StrToInt(FormList[i].Tokuten.Caption) Div 1000);
  338.      End;
  339.      WriteLn(F, Mati.Value);
  340.  
  341.      CloseFile(F);
  342. end;
  343.  
  344. procedure TForm1.KR1Click(Sender: TObject);
  345. var
  346.    i, Cnt : Integer;
  347.    F : TextFile;
  348.    Path : String;
  349.    Pos : Array[1..4] Of Integer;
  350.    Namae : String;
  351. begin
  352.      For i := 0 To MDIChildCount - 1 Do
  353.          MDIChildren[0].Free;
  354.  
  355.      FormCount := 0;
  356.  
  357.      Path := ExtractFilePath(Application.ExeName);
  358.  
  359.      AssignFile(F, Path + 'AgeSage.Dat');
  360.      Reset(F);
  361.  
  362.      ReadLn(F, Cnt);
  363.      For i := 1 To Cnt Do
  364.      Begin
  365.           ReadLn(F, Namae);
  366.           ReadLn(F, Pos[i]);
  367.           KaitousyaTuika(Namae);
  368.           FormList[i].Tokuten.Caption := IntToStr(Pos[i] * 1000);
  369.      End;
  370.      ReadLn(F, i);
  371.      Mati.Value := i;
  372.  
  373.      For i := 1 To Cnt Do
  374.          FormList[i].Top := FormList[i].Top - Pos[i] * UpHeight;
  375.  
  376.      CloseFile(F);
  377. end;
  378.  
  379. {今回追加分ここまで}
  380. procedure TForm1.KA1Click(Sender: TObject);
  381. begin
  382.      AboutBox.ShowModal;
  383. end;
  384.  
  385. end.
  386.